1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *     http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  package org.apache.solr.util;
19  
20  import java.io.IOException;
21  import java.lang.invoke.MethodHandles;
22  import java.util.Map;
23  
24  import org.apache.lucene.index.IndexWriter;
25  import org.apache.lucene.index.MergePolicy;
26  import org.apache.lucene.index.MergeTrigger;
27  import org.apache.lucene.index.SegmentCommitInfo;
28  import org.apache.lucene.index.SegmentInfos;
29  import org.apache.lucene.util.LuceneTestCase;
30  import org.slf4j.Logger;
31  import org.slf4j.LoggerFactory;
32  
33  /**
34   * A {@link MergePolicy} with a no-arg constructor that proxies to a 
35   * wrapped instance retrieved from {@link LuceneTestCase#newMergePolicy}.
36   * Solr tests utilizing the Lucene randomized test framework can refer 
37   * to this class in solrconfig.xml to get a fully randomized merge policy.
38   */
39  public final class RandomMergePolicy extends MergePolicy {
40  
41    private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
42    
43    /** 
44     * Not private so tests can inspect it, 
45     * Not final so it can be set on clone
46     */
47    final MergePolicy inner;
48  
49    public RandomMergePolicy() {
50      this(LuceneTestCase.newMergePolicy());
51    }
52  
53    private RandomMergePolicy(MergePolicy inner) {
54      super(inner.getNoCFSRatio(), 
55            (long) (inner.getMaxCFSSegmentSizeMB() * 1024 * 1024));
56      this.inner = inner;
57      log.info("RandomMergePolicy wrapping {}: {}",
58               inner.getClass(), inner);
59    }
60  
61    @Override
62    public MergeSpecification findForcedDeletesMerges(SegmentInfos segmentInfos, IndexWriter writer) 
63      throws IOException {
64  
65      return inner.findForcedDeletesMerges(segmentInfos, writer);
66    }
67  
68    @Override
69    public MergeSpecification findForcedMerges(SegmentInfos segmentInfos, 
70                                               int maxSegmentCount, 
71                                               Map<SegmentCommitInfo,Boolean> segmentsToMerge,
72                                               IndexWriter writer) 
73      throws IOException {
74      
75      return inner.findForcedMerges(segmentInfos, maxSegmentCount, segmentsToMerge, writer);
76    }
77  
78    @Override
79    public MergeSpecification findMerges(MergeTrigger mergeTrigger, 
80                                         SegmentInfos segmentInfos,
81                                         IndexWriter writer)
82      throws IOException {
83  
84      return inner.findMerges(mergeTrigger, segmentInfos, writer);
85    }
86  
87    @Override
88    public boolean useCompoundFile(SegmentInfos infos,
89                                   SegmentCommitInfo mergedInfo,
90                                   IndexWriter writer)
91      throws IOException {
92      
93      return inner.useCompoundFile(infos, mergedInfo, writer);
94    }
95  
96  }